package com.br.negocio.web.backbean;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import com.br.negocio.controller.ControllerFuncionario;
import com.br.negocio.vo.FuncionarioVO;
import com.br.negocio.vo.home.SexoHome;
import com.br.negocio.web.formbean.FuncionarioFormBean;

@Controller("funcionarioBackBean")
@Scope("session")
public class FuncionarioBackBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Resource
	private ControllerFuncionario controllerFuncionario;
	
	private FuncionarioFormBean funcionarioFormBean;

	public FuncionarioBackBean() {
		super();
		this.funcionarioFormBean = new FuncionarioFormBean();
	}

	public FuncionarioFormBean getFuncionarioFormBean() {
		return this.funcionarioFormBean;
	}

	public void setFuncionarioFormBean(FuncionarioFormBean funcionarioFormBean) {
		this.funcionarioFormBean = funcionarioFormBean;
	}
	
	// M�TODOS

	public void obterListaFuncionario() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			this.funcionarioFormBean.setListaFuncionario(this.controllerFuncionario.obterListaFuncionario());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao obter a lista de funcionarios: " + e.getMessage()));
		}
	}
	
	public void manterFuncionario() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.funcionarioFormBean.getFuncionarioManter().getCodigo() == 0) {
				this.controllerFuncionario.inserirFuncionario(this.funcionarioFormBean.getFuncionarioManter());
			} else {
				this.controllerFuncionario.atualizarFuncionario(this.funcionarioFormBean.getFuncionarioManter());
			}
			this.funcionarioFormBean.setListaFuncionario(this.controllerFuncionario.obterListaFuncionario());
		} catch (Exception e) {
			context.addMessage(null , new FacesMessage("Erro ao manter o funcionario: " + e.getMessage()));
		}
		
	}
	
	public void excluirFuncionario() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.getFuncionarioFormBean().getFuncionarioManter().getCodigo() != 0) {
				this.controllerFuncionario.removerFuncionario(this.funcionarioFormBean.getFuncionarioManter());
				this.funcionarioFormBean.setListaFuncionario(this.controllerFuncionario.obterListaFuncionario());
				this.funcionarioFormBean.setFuncionarioManter(new FuncionarioVO());
			}
		} catch (DataIntegrityViolationException e) {
			if (e.getCause().getClass() == ConstraintViolationException.class) {
				context.addMessage(null, new FacesMessage("Erro ao excluir o funcionario: O funcionario est� associado a alguma outra entidade."));
			} else {
				context.addMessage(null, new FacesMessage("Erro ao excluir o funcionario: " + e.getMessage()));
			}
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao excluir o funcionario: " + e.getMessage()));
		}
	}
	
	// LISTENERS
	
	public void listenerIrInserirFuncionario(ActionEvent evento) {
		this.funcionarioFormBean.setFuncionarioManter(new FuncionarioVO());
		this.funcionarioFormBean.getFuncionarioManter().setSexo(SexoHome.MASCULINO);
		this.funcionarioFormBean.setIsDisabled(false);
		this.funcionarioFormBean.setEnable(true);
		this.funcionarioFormBean.setHead("Cadastar Funcionario");
	}
	
	public void listenerIrExcluirFuncionario(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("funcionarioExcluir");
		FuncionarioVO funcionarioVO = ((FuncionarioVO)comp.getValue());
		
		if (funcionarioVO != null) {
			this.funcionarioFormBean.setFuncionarioManter(this.controllerFuncionario.obterFuncionario(funcionarioVO));
		}
		this.funcionarioFormBean.setHead("Excluir Funcionario");
		this.funcionarioFormBean.setIsDisabled(true);
	}
	
	public void listenerIrEditarFuncionario(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("funcionarioEditar");
		FuncionarioVO funcionarioVO = ((FuncionarioVO)comp.getValue());
		this.funcionarioFormBean.setEnable(false);
		this.funcionarioFormBean.setIsDisabled(true);
		if (funcionarioVO != null) {
			this.funcionarioFormBean.setFuncionarioManter(this.controllerFuncionario.obterFuncionario(funcionarioVO));
		}
		this.funcionarioFormBean.setHead("Editar Funcionario");
		this.funcionarioFormBean.setIsDisabled(false);
	}

}